﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using DAL;
using BOL;
using Website.Logger;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using UtilityExtensions;
using System.IO;
using System.Web.Script.Services;
using System.Web.Services;
using ExtAspNet;

namespace UILGestion.ObraAdmin.OrdenCompras
{
    public partial class OrdenCompraReadForm : System.Web.UI.Page
    {



        public OrdenCompraReadForm()
        {
            bol = new BOL.OrdenCompraBL();
            _db = new dbGestionDataContext(DbUtil.strConnString);
        }
        private BOL.OrdenCompraBL bol;
        private dbGestionDataContext _db;



        [WebMethod(), ScriptMethod()]
        public static string GetSearchEmail(String prefixText, String contextKey)
        {

            //ProveedorBL bol = new ProveedorBL();

            return Util.Tbl2Str(Util.EntidadToDataTable(BOL.BuscarBL.GetEMail(prefixText, 15)));


        }


        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                try
                {
                    internalid.Value = (string)Request.QueryString["id"];
                    idObra.Value = (string)Request.QueryString["idObra"];

                    menuObraCtrl1.loadMenu(int.Parse(idObra.Value), Request.AppRelativeCurrentExecutionFilePath);


                    FormatForm();
                }
                catch (SqlException sqlex)
                {
                    WebServerSideSqlError.Log(sqlex);
                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


                }
                catch (Exception ex)
                {
                    WebServerSideError.Log(ex);
                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

                }

            }
        }

        private void readObject()
        {
            

            OrdenCompraBL bl = new OrdenCompraBL();

            //OrdenCompraInfo OC = bl.loadOrdenCompra(int.Parse(internalid.Value));
            OrdenCompra OC = DbUtil.Db.OrdenCompras.Single(p => p.idInternal == internalid.Value.ToInt()); 

           
            numeroLabel.Text=OC.numDocumento;
            proveedorContLabel.Text=OC.contacProveedor;
            
              
                fechaLabel.Text=OC.fechaEmision.Value.ToShortDateString();
                formaPagoLabel.Text=OC.FormaPago.descripcion;
                monedaLabel.Text=OC.moneda;
                tipoCambioLabel.Text=OC.tipoCambio.ToString();
                idComparativo.Value = OC.idComparativo.ToString();
                observacionInterLBL.Text = OC.observacionInter;
            
            comparativoLNK.Text=(OC.idComparativo!=null)?OC.Comparativo.numDocumento:"";
            comparativoLNK.NavigateUrl = (OC.idComparativo != null)?
                "../Comparativos/ComparativoReadForm.aspx?idObra={0}&id={1}".Fmt(OC.idObra, OC.idComparativo) :
                "";

            centroCostoLabel.Text=OC.centroCosto;

            EstructuraLabel.Text = (OC.idEstructuraCompras != null) ? OC.EstructuraCosto.descripcion: "";
            EstructuraLabel.NavigateUrl = (OC.idEstructuraCompras != null) ?
                "../EstructuraCompras/EstructuraCostoEditForm.aspx?idObra={0}&id={1}".Fmt(OC.idObra, OC.idEstructuraCompras) :
                "";
            
            
                
            subTotalLabel.Text=OC.Moneda1.simbol + OC.subTotal.Value.ToString("N");
            igvLabel.Text = OC.Moneda1.simbol   + OC.IGVTotal.Value.ToString("N");
            totalLabel.Text = OC.Moneda1.simbol + OC.total.Value.ToString("N");

                atencionLabel.Text=OC.atencionEntrega;
                direccionEntregaLabel.Text=OC.direccionEntrega;

                direccionComprabanteLabel.Text=OC.direccionEntComprobante;
                //emisorLabel.te
                observacionLabel.Text=OC.observaciones;
                autorizadorLabel.Text=OC.autorizado;
                revisadoLabel.Text=OC.emisor;
                estadoLabel.Text=OC.GrupoDatoitem.descripcion;
                fechaContratoLabel.Text = OC.fechaContrato.Value.ToShortDateString();
                emisorLabel.Text = OC.emisor;
                fechaEntregaLabel.Text = OC.fechaPedido.Value.ToShortDateString();
                anticipochk.Checked = OC.bitAnticipo.Value;


                  //---------------------- 
                DAL.Menu menu = DbUtil.Db.Menus.Single(p => p.idInternal == 112);

                    string val= String.Format("{0}?Type=A&id={1}",
                                                                menu.url,
                                                                OC.idProveedor);
                    proveedorTXT.Text = (OC.idProveedor == null) ? "" : OC.Proveedor1.descripcion;
                    proveedorTXT.NavigateUrl = "javascript:loadTabFromForm('tab{0}','{1}','{2}');".Fmt(menu.idAplicacion,
                                                                                                      menu.Aplicacion.title,
                                                                                                        val);

                    //-----------------------------                                                                                                      val1);

                addAnticipoBtn.Visible = false;
            //para el caso de  anticipos que deben ser actualizados
                if (OC.bitAnticipo.Value)
                {
                    OrdenCompra oc=DbUtil.Db.OrdenCompras.Single(p=>p.idInternal==internalid.Value.ToInt());
                    var totalAnticipo= oc.OrdenAnticipos.Sum(p=>p.total);
                    if (Math.Round(OC.total.Value,2) - Math.Round(totalAnticipo,2)> 0)
                    {
                        addAnticipoBtn.Visible = true;
                    }
                }

            //para la ni
            IngresoAlmacenButton.Visible=false;
            nuevoFRLinkButton.Visible = false;
                //-----

                itemOrdenCompraGridView.Columns[4].Visible = false;
                itemOrdenCompraGridView.Columns[5].Visible = false;
                    
            if (OC.bitInclIGV.Value)
                {
                    itemOrdenCompraGridView.Columns[4].Visible = false;
                    itemOrdenCompraGridView.Columns[5].Visible = true;
                }
                else
                {
                    itemOrdenCompraGridView.Columns[4].Visible = true;
                    itemOrdenCompraGridView.Columns[5].Visible = false;
                    
                }
           

                if (OC.idEstado == 11) ///emision
                {
                    AprobarButton.Visible = true;
                    EditarButton.Visible = true;
                }
                else
                    AprobarButton.Visible = false;
                if (OC.idEstado == 13) //aprobado
                {
                    if (bl.EsOrdenSinRecepcion(OC.idInternal))
                    {
                        IngresoAlmacenButton.Visible=true;
                        DAL.Menu menu1=DbUtil.Db.Menus.Single(p=>p.idInternal==110);
                        string val1=String.Format("{0}?Type=A&idOC={1}&idAlmacen={2}&idObra={3}",
                                                                        menu1.url,
                                                                        internalid.Value,
                                                                        OC.idAlmacen,
                                                                        idObra.Value);

                        IngresoAlmacenButton.NavigateUrl = "javascript:loadTabFromForm('tab{0}-{1}','{2}','{3}');".Fmt(menu1.idAplicacion,
                                                                                                                OC.idAlmacen,
                                                                                                                OC.Almacen.descripcion,
                                                                                                                val1);
                            
                    }
                    if (bl.EsOrdenSinFacturar(OC.idInternal))
                    {
                        nuevoFRLinkButton.Visible = true;
                        nuevoFRLinkButton.PostBackUrl = String.Format("../RecepcionDoc/RecepcionDocInsertForm.aspx?Type=A&idOC={0}&idObra={1}",
                            internalid.Value, idObra.Value);
                    }
                    
                }

           

                DatabindOrdenCompraItem(bl);
                DatabindMensaje(bl);
               
                DataBindRecepcionDoc();
              
        

            
            //correo del empleado
            Empleado ep=DbUtil.Db.Empleados.Single(p=>p.idInternal==(int)Session["idEmpleado"]);
            EnvioCorreoPanel1.Origen= ep.email;
            EnvioCorreoPanel1.destinatario = OC.Proveedor1.emailContacto;

        }

        private void  DatabindMensaje(OrdenCompraBL bl)
    {
              
                MensajeGridView.DataSource = bl.GetOrdenCompraMensajeList(int.Parse(internalid.Value));
                MensajeGridView.DataBind();

    }
        private void DatabindOrdenCompraItem(OrdenCompraBL bl)
        {
            
            itemOrdenCompraGridView.DataSource = bl.getOrdenCompraItem(DbUtil.Db,int.Parse(internalid.Value));
            itemOrdenCompraGridView.DataBind();
            itemUpdatePanel.Update();
        }

        //private void DataBindNotaIngreso()
        //{
        //    NotaIngresoBL ingresoBL = new NotaIngresoBL();
        //    List<NotaIngresoListInfo> ni = ingresoBL.GetNotaIngresoListXOrdenCompra(int.Parse(internalid.Value));

        //    notaIngresoGridView.DataSource = ni;
        //    notaIngresoGridView.DataBind();
        //}

        private void DataBindRecepcionDoc()
        {
            RecepcionDocBL recepcion = new RecepcionDocBL();

            List<RecepcionDocListInfo> listaFactura = recepcion.getDocListFromOrdenCompra(int.Parse(internalid.Value));

            documentoGridView.DataSource = listaFactura;
            documentoGridView.DataBind();

        }

        private void FormatForm()
        {

            //--------------------
            int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
            bool acceso = new DAL.FormularioAcceso().VerificarAcceso(DbUtil.Db,
                idEmpleadoEmisor,
                3, //OrdenCompra compra
                int.Parse(idObra.Value),
                1); //lectura
            //------------------------- 
            // los paneles presentes en el formulario
            pnlMain.Visible = true;
            PanelBody.Visible = true;
            PanelButtom.Visible = true;

            //-----------------------------

            //ShowAllComboBox();
            //restricionesForm();



   //         string Lang = "es-ES";  //para controlar el idioma 
   //         System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo
   //(Lang);

            readObject();

          
        }



        #region "Bottones"




        protected void aprobarButton_Click(object sender, EventArgs e)
        {
            try
            {
                OrdenCompraBL OC = new OrdenCompraBL();
                bool result = OC.updateAutorizacion(_db,int.Parse(internalid.Value));

                //luego de guardar la orden de compra

                try
                {

                

                ReportDocument crystalReport = new ReportDocument();

                crystalReport.Load(Server.MapPath("~/Rpt/OrdenCompraViewRPT.rpt"));
                crystalReport.SetDataSource(OC.loadOrdenCompraRPT(int.Parse(internalid.Value),null));

                string directorioObra
                                = Server.MapPath("~/App_Data/OrdenCompra/{0}/".Fmt(Session["idEmpresa"].ToString()));
                if (!Directory.Exists(directorioObra))
                    Directory.CreateDirectory(directorioObra);
                //datos del registro de los  oC

                //es importante saber si elimina el anterior archivo

                string ruta = Server.MapPath("~/App_Data/OrdenCompra/{0}/{1}.pdf".Fmt(Session["idEmpresa"].ToString(), numeroLabel.Text));
                crystalReport.ExportToDisk(ExportFormatType.PortableDocFormat, ruta);
                }
                catch (Exception)
                {

                }




                if (result)
                {
                    Response.Redirect("OrdenCompraReadForm.aspx?idObra=" + idObra.Value+"&id="+internalid.Value, false);
                }
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
        }

        protected void nuevoButton_Click(object sender, EventArgs e)
        {
            Response.Redirect("OrdenCompraEditForm.aspx?type=A&idObra=" + idObra.Value, true);
        }
        

        protected void refreshButton_Click(object sender, EventArgs e)
        {
            try
            {
                FormatForm();
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }

        }

        protected void EliminarButton_Click(object sender, EventArgs e)
        {
            try
            {
                OrdenCompraBL OC = new OrdenCompraBL();
                bool result = OC.deleteOrdenCompra(int.Parse(internalid.Value));
                
                

                if (result)
                {
                    Response.Redirect("OrdenCompraListForm.aspx?idObra=" + idObra.Value, false);
                }
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
        }

        protected void Imprimir_Click(object sender, EventArgs e)
        {
            try
            {
                 
                Response.Redirect("../Rpt/PrintForm.aspx?idObra=" + idObra.Value + "&idOrdenCompra=" + internalid.Value,false);
                //UtilityExtensions.ResponseHelper.Redirect("../Rpt/PrintForm.aspx?idObra=" + idObra.Value + "&idOrdenCompra=" + internalid.Value, "_blank", "menubar=0,width=100,height=100");
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
            
        }

        


        protected void anteriorButton_Click(object sender, EventArgs e)
        {
            try
            {
                OrdenCompra cp = new OrdenCompra();
                dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString);
                int idAnterior = cp.getidAnterior(_db, int.Parse(internalid.Value), int.Parse(idObra.Value),1);


                Response.Redirect("OrdenCompraReadForm.aspx?id=" + idAnterior.ToString() + "&idObra=" + idObra.Value, false);

            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
        }

        protected void siguienteButton_Click(object sender, EventArgs e)
        {
            try
            {

                dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString);
                OrdenCompra cp = new OrdenCompra();

                int siguiente = cp.getidSiguiente(_db, int.Parse(internalid.Value), int.Parse(idObra.Value),1);

                Response.Redirect("OrdenCompraReadForm.aspx?id=" + siguiente.ToString() + "&idObra=" + idObra.Value, false);

            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
        }
        
        protected void EditarButton_Click(object sender, EventArgs e)
        {
            try
            {

            
                    Response.Redirect("OrdenCompraEditForm.aspx?type=E&id={0}&idObra={1}".Fmt(internalid.Value,idObra.Value), false);
            
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }



        }

        #endregion


        protected void envioCorreo(object sender, EventArgs e)
        {

            try
            {

                EnvioCorreoPanel1.LoadEnvioCorreoMensaje(int.Parse(internalid.Value),null, numeroLabel.Text);

                EnvioMailModalpopupextender.Show();


              
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }

            
           

           



        }

        protected void EnviarEmailBtn_Click(object sender, EventArgs e)
        {
            try
            {



                EnvioMailModalpopupextender.Hide();
                 BOL.OrdenCompraBL ocBL = new BOL.OrdenCompraBL();
                //buscamos en app_data el archivo
                string archivo
                                = Server.MapPath("~/App_Data/OrdenCompra/{0}/{1}.pdf".Fmt(Session["idEmpresa"], numeroLabel.Text));

                if (!File.Exists(archivo))
                {
                    throw new Exception("No existe Archivo pdf verifique reporte. el correo No podra ser envioado");
                }

                //el usuario quien crea el correo
                Empleado empleado = DbUtil.Db.Empleados.Single(p => p.idInternal == (int)(Session["idEmpleado"]));

                //para ser enviado
                List<string> archivos = new List<string>();
                archivos.Add(archivo);

                Util.SendMsg(
                         Util.SysFromEmail,
                         Util.Host,
                         Util.TryGetMailAddress(EnvioCorreoPanel1.Origen),
                         EnvioCorreoPanel1.asunto,
                         EnvioCorreoPanel1.mensaje,
                         Util.EmailAddressListFromString(EnvioCorreoPanel1.destinatario),
                         Util.EmailAddressListFromString(EnvioCorreoPanel1.copiaDestinatarios),
                         internalid.Value.ToInt(),
                         archivos,
                         false);

                ocBL.addMensaje(int.Parse(internalid.Value),
                                EnvioCorreoPanel1.Origen,
                                EnvioCorreoPanel1.destinatario,
                                EnvioCorreoPanel1.copiaDestinatarios,
                                  EnvioCorreoPanel1.asunto,
                                 EnvioCorreoPanel1.mensaje,
                                "{0}.pdf".Fmt(numeroLabel.Text));

                DatabindMensaje(ocBL);
                EnvioMailModalpopupextender.Hide();


            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
        }

        protected void addAnticipoBtn_Click(object sender, EventArgs e)
        {
            try
            {
                OrdenCompra orden=DbUtil.Db.OrdenCompras.Single(p=>p.idInternal==internalid.Value.ToInt());
                OrdenAnticipoPanel1.Load(orden);
                anticipoUpdatePanel.Update();
                anticipoModalPPE.Show();

            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
            
           
        }

        protected void guardarAnticipo(object sender, EventArgs e)
        {
            try
            {
                var orden = OrdenAnticipoPanel1.OrdenAnticipoInfo;

                    
                OrdenCompraBL bl = new OrdenCompraBL();
                bl.AddOrdenAnticipo(internalid.Value.ToInt(),
                                    orden.fecha,
                                    orden.descripcion,
                                    orden.total);

                OrdenAnticipoListGrid1.DataBind();
                anticipoModalPPE.Hide();
                
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
        }
    }
}